package com.zengdb.mybatis.dao;

import java.util.List;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.ResultMap;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import com.zengdb.mybatis.domain.User;
import com.zengdb.mybatis.query.QueryObject;

/**
 * 使用接口的方式映射xml文件中的SQL语句
        注意点:
	1.接口的权限定名==UserMapper.xml文件中namespace
	2.接口上的方法名==UserMapper.xml文件中的id
	3.接口中方法的参数类型==UserMapper.xml文件中标签中的parameterType一致.
	4.接口中方法的返回值类型/返回值中的泛型==UserMapper.xml文件标签中resultType一致.
 * @author zengdb
 * 代码行的结尾为//，是为了防止格式化代码时格式乱掉
 */
public interface UserMapper {

	/**
	 * 保存一个User对象
	 * @param user 需要保存的User对象
	 */
	@Insert(value = { //
			"INSERT INTO t_user(username,password,age) ", //
			"VALUES(#{username},#{password},#{age})" //
	})
	@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
	void saveOne(User user);

	/**
	 * 修改一个User对象信息
	 * @param user 需要修改的User对象
	 */
	void updateOne(User user);

	/**
	 * 根据用户id查询User对象
	 * @param id 用户id
	 * @return 返回一个User对象，不存在返回null
	 */
	@Select(value = { //
			"SELECT id AS u_id, username AS u_username, password AS u_password, age AS u_age", //
			"FROM t_user WHERE id = #{id}"//
	})
	@ResultMap("baseMap") //使用mybatis/UserMapper.xml中id为baseMap的resultMap
	User selectOne(Long id);

	/**
	 * 
	 * @return 返回用户列表集合，没有一个用户对象时存在返回空白的集合
	 */
	@Select(value = { //
			"SELECT id AS u_id, username AS u_username, password AS u_password, age AS u_age", //
			"FROM t_user" //
	})
	@Results(value = { // 
			@Result(id = true, column = "u_id", property = "id"), // 
			@Result(column = "u_username", property = "username"), // 
			@Result(column = "u_password", property = "password"), // 
			@Result(column = "u_age", property = "age"), // 
	})
	List<User> selectAll();

	/**
	 * 删除一个User对象
	 * @param id 需要被删除的User对象的id
	 */
	void deleteOne(Long id);

	/**
	 * 
	 * @param qo User的查询对象
	 * @return 返回满足查询的总记录数
	 */
	Integer queryByConditionCount(QueryObject qo);

	/**
	 * 
	 * @param qo User的查询对象
	 * @return 返回 满足条件的User集合
	 */
	List<User> queryByCondition(QueryObject qo);

}
